home *** CD-ROM | disk | FTP | other *** search
/ Aminet 37 / Aminet 37 (2000)(Schatztruhe)[!][Jun 2000].iso / Aminet / game / patch / jst32b_dev.lha / jst_dev / sources / OSEmu / graphics.s < prev    next >
Text File  |  2000-03-31  |  21KB  |  1,032 lines

  1. * $Id: graphics.s 1.1 1999/02/03 04:10:07 jotd Exp jotd $
  2. **************************************************************************
  3. *    GRAPHICS LIBRARY
  4. **************************************************************************
  5. **************************************************************************
  6. *    INITIALIZATION
  7. **************************************************************************
  8.  
  9. GFXINIT        move.l    _gfxbase,d0
  10.         beq    .init
  11.         rts
  12.  
  13. .init        move.l    #1056,d0    ;-_LVOWriteChunkyPixels,d0
  14.         move.l    #$220,d1
  15.         lea    _gfxname,a0
  16.         bsr    _InitLibrary
  17.         move.l    d0,a0
  18.         move.l    d0,_gfxbase
  19.         
  20.         patch    _LVOOwnBlitter(a0),MYRTS(PC)
  21.         patch    _LVODisownBlitter(a0),MYRTS(PC)
  22.         patch    _LVOInitView(a0),_InitView(PC)
  23.         patch    _LVOInitVPort(a0),_InitVPort(PC)
  24.         patch    _LVOFreeVPortCopLists(a0),_FreeVPortCopLists(PC)
  25.         patch    _LVOInitBitMap(a0),_InitBitMap(PC)
  26.         patch    _LVOInitRastPort(a0),_InitRastPort(PC)
  27.         patch    _LVOMakeVPort(a0),_MakeVPort(PC)
  28.         patch    _LVOMrgCop(a0),_MrgCop(PC)
  29.         patch    _LVOCWait(a0),_CWait(PC)    ; added by JOTD
  30.         patch    _LVOCMove(a0),_CMove(PC)    ; added by JOTD
  31.         patch    _LVOCBump(a0),_CBump(PC)    ; added by JOTD
  32.         patch    _LVOLoadView(a0),_LoadView(PC)
  33.         patch    _LVOLoadRGB4(a0),_LoadRGB4(PC)
  34.         patch    _LVOSetRGB4(a0),_SetRGB4(PC)
  35.         patch    _LVOFreeSprite(a0),_FreeSprite(PC)
  36.         patch    _LVOGetSprite(a0),_GetSprite(PC)
  37.         patch    _LVOChangeSprite(a0),_ChangeSprite(PC)
  38.         patch    _LVOMoveSprite(a0),_MoveSprite(PC)
  39.         patch    _LVOWaitBlit(a0),_WaitBlit(PC)
  40.         patch    _LVOBltBitMap(a0),_BltBitMap(PC)
  41.         patch    _LVOVBeamPos(a0),_VBeamPos(PC)
  42.         patch    _LVODraw(a0),MYRTS(PC)
  43.         patch    _LVOMove(a0),_SETMOVE(PC)
  44.         patch    _LVOSetAPen(a0),_SETAPEN(PC)
  45.         patch    _LVOSetBPen(a0),_SETBPEN(PC)
  46.         patch    _LVOSetDrMd(a0),_SETDRAWMODE(PC)
  47.         patch    _LVOWaitTOF(a0),_WaitTOF(PC)
  48. ;;        patch    _LVOWaitBOVP(a0),_WaitBOVP(PC)        ; -- added by JOTD
  49.         patch    _LVORectFill(a0),_RectFill(PC)        ; -- added by JOTD
  50.         patch    _LVOSetRast(a0),_SetRast(PC)        ; -- added by JOTD
  51.         patch    _LVOInitTmpRas(a0),_InitTmpRas(PC)    ; -- added by JOTD
  52.         patch    _LVOInitArea(a0),_InitArea(PC)        ; -- added by JOTD
  53.         patch    _LVOReadPixel(a0),_ReadPixel(PC)
  54.         patch    _LVOWritePixel(a0),_WritePixel(PC)
  55.         patch    _LVOBltTemplate(a0),_BltTemplate(PC)
  56.         patch    _LVOAllocRaster(A0),_ALLOCRASTER(PC)
  57.         patch    _LVOFreeRaster(A0),_FREERASTER(PC)
  58.         patch    _LVOBltClear(A0),_BLTCLEAR(PC)
  59.         patch    _LVOGetColorMap(A0),_GETCOLORMAP(PC)
  60.         patch    _LVOFreeColorMap(A0),_FREECOLORMAP(PC)
  61.     ;;    patch    _LVOUCopperListInit(a0),_UCOPPERLISTINIT(PC) ; -- added by JOTD
  62.  
  63.         patch    _LVOOpenFont(A0),_OPENFONT(PC)
  64.         patch    _LVOSetFont(A0),_SETFONT(PC)
  65.         patch    _LVOText(A0),_PRINTTEXT(PC)
  66.  
  67.         MOVE.L    #MYVIEW,gb_ActiView(A0)
  68.         lea    STDCOPPER(PC),a1
  69.         MOVE.L    a1,(gb_LOFlist,A0)
  70.         MOVE.L    a1,(gb_SHFlist,A0)
  71.         MOVE.L    a1,(_custom+cop2lc)
  72.         lea    CPJMP2,a1
  73.         move.l    a1,(gb_copinit,a0)
  74.         MOVE.L    a1,(_custom+cop1lc)
  75.         lea.l   _TOPAZ8FONT(PC),a1        ; added by Harry
  76.         move.l  a1,(gb_DefaultFont,a0)        ; added by Harry
  77.  
  78.         moveq    #4,d0                ;pal
  79.         cmp.l    #PAL_MONITOR_ID,_monitor
  80.         beq    .1
  81.         moveq    #1,d0                ;ntsc
  82. .1        MOVE.W    d0,(gb_DisplayFlags,A0)
  83.  
  84.         clr.b    (gb_SpriteReserved,a0)
  85.  
  86.         clr.l    -(a7)                ;TAG_DONE
  87.         pea    RESTORECOPPER2(pc)
  88.         move.l    #WHDLTAG_CBSWITCH_SET,-(a7)
  89.         move.l    a7,a0
  90.         move.l    _RESLOAD(pc),a1
  91.         jsr    (resload_Control,a1)
  92.         lea    (12,a7),a7                      ;restore sp
  93.         
  94.         tst.w    (_custom+copjmp1)
  95.         move.w    #DMAF_SETCLR!DMAF_MASTER!DMAF_COPPER!DMAF_BLITTER,(_custom+dmacon)
  96.  
  97.         rts
  98.  
  99. RESTORECOPPER2    move.l    a1,.save
  100.         move.l    _gfxbase,a1
  101.         move.l    (gb_LOFlist,a1),(_custom+cop2lc)
  102.         move.l    .save,a1
  103.         jmp    (A0)
  104.  
  105.     CNOP 0,4
  106. .save        dc.l    0
  107. CPJMP2        dc.l    $0201fffe    ;wait 0,2
  108.         DC.L    $008A0000
  109. STDCOPPER    DC.L    $FFFFFFFE
  110.  
  111. MYVIEW
  112.     DC.L    _INITVIEWPORT
  113.     DC.L    STDCOPPER
  114.     DC.L    STDCOPPER
  115.     DC.W    0
  116.     DC.W    0
  117.     DC.W    0
  118.  
  119. _INITVIEWPORT
  120.     DC.L    $EEEEEEEE
  121.     DC.L    $EEEEEEEE
  122.     DC.L    $EEEEEEEE
  123.     DC.L    $EEEEEEEE
  124.     DC.L    $EEEEEEEE
  125.     DC.L    0
  126.     DC.W    0
  127.     DC.W    0
  128.     DC.W    0
  129.     DC.W    0
  130.     DC.W    0
  131.     DC.B    0,0
  132.     DC.L    _INITRASINFO
  133.  
  134. _INITRASINFO
  135.     DC.L    0
  136.     DC.L    $EEEEEEEE
  137.     DC.W    0
  138.     DC.W    0
  139.  
  140. _FONTTABLE
  141.     DC.L    _TOPAZNAME,_TOPAZ8FONT
  142.     DC.L    0
  143.  
  144. _TOPAZNAME
  145.     DC.B    'topaz.font',0
  146.     EVEN
  147.  
  148. _TOPAZ8FONT
  149.     DC.L    0,0,0,0,0        ;EMPTY MESSAGEPORT
  150.     DC.W    8            ;YSIZE
  151.     DC.B    0            ;NO SPECIAL STYLE
  152.     DC.B    $41            ;FONTFLAGS:DESIGNED,ROMFONT
  153.     DC.W    8            ;XSIZE
  154.     DC.W    6            ;BASELINE
  155.     DC.W    1            ;FETT: 1 PIXEL VERSETZT
  156.     DC.W    1            ;1 TASK BENUTZT FONT (DUMMY)
  157.     DC.B    $20            ;LOWEST CHAR IS SPACE
  158.     DC.B    $FF            ;HIGHEST CHAR IS "y
  159.     DC.L    _TOPAZ8DATA        ;FONTIMAGES
  160.     DC.W    $C0            ;MODULO
  161.     DC.L    _TOPAZ8OFFSETS        ;OFFSETTABLES
  162.     DC.L    0            ;NON PROPORTIONAL FONT
  163.     DC.L    0            ;NO KERNING
  164.  
  165. _TOPAZ8DATA
  166.     INCBIN    REPLFONT_DATA
  167.  
  168. _TOPAZ8OFFSETS
  169.     INCBIN    REPLFONT_BITS
  170.  
  171. **************************************************************************
  172. *    GRAPHICS LIBRARY FUNCTIONS
  173. **************************************************************************
  174.  
  175. _UCOPPERLISTINIT:
  176.     cmp.l    #0,a0
  177.     bne.b    .nz
  178.     moveq.l    #0,D0
  179.     bra.b    .exit    ; error, returns NULL
  180. .nz
  181.     ; ok, we can continue
  182.  
  183.     mulu    #3,D0    ; n*4*3 bytes to initialize
  184.     subq.l    #1,D0
  185. .loop    
  186.     
  187.     move.l    a0,D0
  188. .exit:
  189.     rts
  190.  
  191. _FreeVPortCopLists:
  192.     move.l    A2,-(A7)
  193.     move.l    A0,A2
  194.     move.l    #200,D1
  195.     move.l    (vp_DspIns,a2),A1
  196.     move.l    (4),A6
  197.     jsr    (_LVOFreeMem,A6)
  198.  
  199.     clr.l    (vp_DspIns,a2)
  200.  
  201.     ; nothing allocated for the 3 of them below
  202.  
  203.     clr.l    (vp_SprIns,a2)
  204.     clr.l    (vp_ClrIns,a2)
  205.     clr.l    (vp_UCopIns,a2)
  206.  
  207.     move.l    (a7)+,A2
  208.     rts
  209.  
  210. _InitTmpRas:
  211.     move.l    A1,(A0)
  212.     move.l    D0,4(A0)
  213.     move.l    A0,D0
  214.     rts
  215.  
  216. _InitArea:
  217.     MOVE.L    A1,4(A0)
  218.     MOVE.L    A1,(A0)
  219.     MOVE    D0,18(A0)
  220.     ASL.L    #2,D0
  221.     ADDA    D0,A1
  222.     MOVE.L    A1,12(A0)
  223.     MOVE.L    A1,8(A0)
  224.     CLR    16(A0)
  225.     RTS
  226.     
  227. _InitView
  228.     movem.l    D0/A0,-(A7)
  229.     move.w    #$8,D0
  230. .zero
  231.     clr.w    (A0)+
  232.     dbf    D0,.zero
  233.     movem.l    (A7)+,D0/A0
  234.     rts
  235.  
  236. _InitVPort    
  237.     movem.l    D0/A0,-(A7)
  238.     move.w    #9,D0
  239. .zero
  240.     clr.l    (A0)+
  241.     dbf    D0,.zero
  242.     movem.l    (A7)+,D0/A0    
  243.     rts
  244.  
  245. _InitRastPort
  246.     MOVE.L    #$EEEEEEEE,(A1)
  247.     MOVE.L    #0,rp_BitMap(A1)
  248.     MOVE.L    #$EEEEEEEE,rp_AreaPtrn(A1)
  249.     MOVE.L    #$EEEEEEEE,rp_TmpRas(A1)
  250.     MOVE.L    #$EEEEEEEE,rp_AreaInfo(A1)
  251.     MOVE.L    #0,rp_GelsInfo(A1)
  252.     MOVE.L    #$FF0000FF,rp_Mask(A1)    
  253.     MOVE.L    #$01000000,rp_DrawMode(A1)
  254.     CLR.L    rp_Flags(A1)
  255.     CLR.L    rp_cp_x(A1)
  256.     CLR.L    rp_minterms(A1)
  257.     CLR.L    rp_minterms+4(A1)
  258.     CLR.L    rp_PenWidth(A1)
  259.     MOVE.L    #_TOPAZ8FONT,rp_Font(A1)
  260.     CLR.W    rp_AlgoStyle(A1)
  261.     MOVE.L    #$00080008,rp_TxHeight(A1)
  262.     MOVE.L    #$00060008,rp_TxBaseline(A1)
  263.     CLR.L    rp_RP_User(A1)
  264.     RTS
  265.  
  266. _SETAPEN
  267.     MOVE.B    D0,rp_FgPen(A1)
  268.     RTS
  269.  
  270. _SETBPEN
  271.     MOVE.B    D0,rp_BgPen(A1)
  272.     RTS
  273.  
  274. _SETDRAWMODE
  275.     MOVE.B    D0,rp_DrawMode(A1)
  276.     RTS
  277.  
  278. _SETMOVE
  279.     MOVE.W    D0,rp_cp_x(A1)
  280.     MOVE.W    D1,rp_cp_y(A1)
  281.     RTS
  282.  
  283. _BLTCLEAR    AND.W    #2,D1
  284.     BNE.S    .FAIL
  285.     LSR.W    #1,D0
  286.     SUBQ.W    #1,D0
  287. .1    CLR.W    (A1)+
  288.     DBF    D0,.1
  289.     RTS
  290.  
  291. .FAIL        pea    _LVOBltClear
  292.         pea    _gfxname
  293.         bra    _emufail
  294.  
  295. _ALLOCRASTER
  296.     ADD.W    #$F,D0
  297.     LSR.W    #3,D0
  298.     AND.W    #$FFFE,D0
  299.     MULU    D1,D0
  300.     MOVEQ.L    #MEMF_CHIP!MEMF_PUBLIC,D1
  301.     BSR.W    ALLOCM
  302.     RTS
  303.  
  304. _FREERASTER
  305.     ADD.W    #$F,D0
  306.     LSR.W    #3,D0
  307.     AND.W    #$FFFE,D0
  308.     MULU    D1,D0
  309.     MOVE.L    A0,A1
  310.     BSR.W    FREEM
  311.     RTS
  312.  
  313. _GETCOLORMAP
  314.     MOVE.L    D0,-(A7)
  315.     ADD.L    D0,D0
  316.     ADDQ.L    #8,D0
  317.     MOVE.L    #MEMF_CLEAR,D1
  318.     BSR.W    ALLOCM
  319.     TST.L    D0
  320.     BEQ.S    .FAIL
  321.     MOVE.L    D0,A0
  322.     MOVE.L    (A7)+,D1
  323.     MOVE.W    D1,cm_Count(A0)
  324.     LEA.L    8(A0),A1
  325.     MOVE.L    A1,cm_ColorTable(A0)
  326.     CMP.W    #$20,D1
  327.     BLS.S    .1
  328.     MOVEQ.L    #$20,D1
  329. .1    LEA.L    .COLORTAB(PC),A0
  330. .2    MOVE.W    (A0)+,(A1)+
  331.     SUBQ.W    #1,D1
  332.     BNE.S    .2
  333.  
  334. .FAIL    RTS
  335.  
  336. .COLORTAB
  337.     DC.B    $00,$00,$0F,$00,$00,$F0,$0F,$F0
  338.     DC.B    $00,$0F,$0F,$0F,$00,$FF,$0F,$FF
  339.     DC.B    $06,$20,$0E,$50,$09,$F1,$0E,$B0
  340.     DC.B    $05,$5F,$09,$2F,$00,$F8,$0C,$CC
  341.     DC.B    $00,$00,$01,$11,$02,$22,$03,$33
  342.     DC.B    $04,$44,$05,$55,$06,$66,$07,$77
  343.     DC.B    $08,$88,$09,$99,$0A,$AA,$0B,$BB
  344.     DC.B    $0C,$CC,$0D,$DD,$0E,$EE,$0F,$FF
  345.  
  346. _FREECOLORMAP    ;A0-*COLORMAP
  347.     MOVE.L    (A2),-(A7)
  348.     MOVE.L    A0,A2
  349.     MOVE.L    cm_ColorTable(A2),A1
  350.     MOVEQ.L    #0,D0
  351.     MOVE.W    cm_Count(A2),D0
  352.     ADD.L    D0,D0
  353.     ADDQ.L    #7,D0
  354.     AND.L    #$FFFFFFF8,D0
  355.     BSR.W    FREEM
  356.  
  357.     MOVE.L    A2,A1
  358.     MOVEQ.L    #8,D0
  359.     BSR.W    FREEM
  360.     MOVE.L    (A7)+,A2
  361.     RTS
  362.  
  363. _OPENFONT    
  364.         move.l    a2,-(a7)
  365. ;        CMP.W    #8,4(A0)
  366. ;        BNE.S    .ERR
  367.         MOVE.L    (A0),A1
  368.  
  369.         lea    _FONTTABLE(PC),a2
  370. .next        move.l    (a2)+,a0
  371.         move.l    a0,d0
  372.         beq    .ERR
  373.         bsr    _strcmp
  374.         beq    .found
  375.         addq.l    #4,a2
  376.         bra    .next
  377.  
  378. .found        MOVE.L    (A2),D0
  379.         move.l    (a7)+,a2
  380.         rts
  381.  
  382. .ERR        pea    _LVOOpenFont
  383.         pea    _gfxname
  384.         bra    _emufail
  385.  
  386. _SETFONT    MOVE.L    A0,rp_Font(A1)
  387.         CLR.W    rp_AlgoStyle(A1)
  388.         MOVE.W    tf_YSize(A0),rp_TxHeight(A1)
  389.         MOVE.W    tf_XSize(A0),rp_TxWidth(A1)
  390.         MOVE.W    tf_Baseline(A0),rp_TxBaseline(A1)
  391.         MOVE.W    tf_XSize(A0),rp_TxSpacing(A1)
  392.         RTS
  393.  
  394.  
  395. _PRINTTEXT    ;A0-*STRING, A1-*RASTPORT, D0-CHARCOUNT
  396.         MOVEM.L    D2-D7/A2-A6,-(A7)
  397.         MOVE.L    A0,A2            ;keep stringpointer
  398.         MOVE.L    D0,D2
  399.         MOVE.L    rp_Font(A1),A3        ;get font
  400.         MOVE.L    tf_CharLoc(A3),A4    ;get chardescriptionpointer
  401. .NXPRINT    MOVE.L    D2,-(A7)
  402.         MOVE.L    tf_CharData(A3),A5    ;get chardatapointer
  403.         MOVEQ.L    #0,D3
  404.         MOVE.B    (A2)+,D3        ;get char
  405.         CMP.B    tf_HiChar(A3),D3
  406.         BHI.S    .SPACEPRINT
  407.         CMP.B    tf_LoChar(A3),D3
  408.         BHS.S    .OKPRINT
  409. .SPACEPRINT    MOVE.B    tf_LoChar(A3),D3
  410. .OKPRINT    SUB.B    tf_LoChar(A3),D3
  411.         LSL.W    #2,D3
  412.         MOVE.W    (A4,D3.W),D4    ;get charposition on font - bitoffset
  413.         MOVE.W    2(A4,D3.W),D2        ;bitwidth of char
  414.         MOVE.W    D4,D3
  415.         AND.W    #$F,D4            ;bitshift
  416.         AND.W    #$FFF0,D3
  417.         LSR.W    #3,D3            ;byteoffset of char
  418.         MOVE.W    rp_cp_x(A1),D6        ;x-printposition
  419.         MOVE.W    D6,D5
  420.         AND.W    #$F,D6            ;x-bitshift
  421.         AND.W    #$FFF0,D5
  422.         LSR.W    #3,D5
  423.         EXT.L    D5
  424.         MOVE.W    rp_cp_y(A1),D7        ;y-printposition
  425.         SUB.W    tf_Baseline(A3),D7
  426.         MOVE.L    rp_BitMap(A1),A0
  427.         MULU    (A0),D7        ;memoryoffset of the line by * bytesperrow
  428.         ADD.L    D5,D7        ;memoffset of printposition w/o shift
  429.  
  430.         MOVEQ.L    #0,D1            ;print char
  431. .NXLINE        MOVE.L    (A5,D3.W),D5        ;get charline from charsetdata
  432.         LSL.L    D4,D5
  433.         MOVEQ.L    #-1,D0            ;mask rest out
  434.         LSR.L    D2,D0
  435.         NOT.L    D0
  436.         AND.L    D0,D5        ;chardata in D5, beginning with bit 31
  437.         LSR.L    D6,D5
  438.         LSR.L    D6,D0        ;contain now a 'window' of set bits at printpos
  439.         MOVEM.L    D1/D3/D4/D6,-(A7)
  440.         BTST    #0,rp_AlgoStyle(A1)
  441.         BEQ.S    .NOUNDERLINE
  442.         MOVE.W    tf_YSize(A3),D3
  443.         SUBQ.W    #1,D3
  444.         CMP.W    D3,D1
  445.         BNE.S    .NOUNDERLINE
  446.         MOVE.L    D0,D5
  447. .NOUNDERLINE    MOVE.L    D0,D3
  448.         NOT.L    D3
  449.         MOVEQ.L    #0,D6
  450. .NXPLANE    MOVE.L    D6,D1
  451.         LSL.L    #2,D1
  452.         MOVE.L    bm_Planes(A0,D1.W),A6    ;planepointertable in a6
  453.         MOVE.L    (A6,D7.L),D1        ;screendata
  454.         BTST    #0,rp_DrawMode(A1)    ;test if JAM2
  455.         BNE.S    .JAM2
  456.         OR.L    D5,D1
  457.         BTST    D6,rp_FgPen(A1)
  458.         BNE.S    .MOVETOPLANE
  459.         EOR.L    D5,D1
  460.         BRA.S    .MOVETOPLANE
  461.                         ;now check colors
  462. .JAM2        BTST    D6,rp_BgPen(A1)
  463.         BNE.S    .BGSET
  464.         AND.L    D3,D1            ;clear bits
  465.         BTST    D6,rp_FgPen(A1)
  466.         BEQ.S    .KEEPFG1
  467.         OR.L    D5,D1            ;set bits
  468. .KEEPFG1    BRA.S    .MOVETOPLANE
  469.  
  470. .BGSET        OR.L    D0,D1
  471.         BTST    D6,rp_FgPen(A1)
  472.         BNE.S    .KEEPFG2
  473.         EOR.L    D5,D1
  474. .KEEPFG2
  475. .MOVETOPLANE    MOVE.L    D1,(A6,D7.L)
  476.         ADDQ.L    #1,D6
  477.         CMP.B    bm_Depth(A0),D6        ;for each bitplane
  478.         BLO.S    .NXPLANE
  479.         MOVEM.L    (A7)+,D1/D3/D4/D6
  480.  
  481.         ADD.W    tf_Modulo(A3),A5
  482.         MOVE.L    D7,A6
  483.         ADD.W    bm_BytesPerRow(A0),A6
  484.         MOVE.L    A6,D7
  485.         ADDQ.L    #1,D1
  486.         CMP.W    tf_YSize(A3),D1        ;all lines
  487.         BLO.W    .NXLINE
  488.         ADD.W    D2,rp_cp_x(A1)        ;rp_position moved
  489.         MOVE.L    (A7)+,D2
  490.         SUBQ.L    #1,D2            ;until string is exhausted
  491.         BNE.W    .NXPRINT
  492.         MOVEM.L    (A7)+,D2-D7/A2-A6
  493.         RTS
  494.  
  495. _InitBitMap    ;a0=bm d0=depth d1=width d2=height
  496.         addq.w    #7,d1
  497.         lsr.w    #3,d1
  498.         AND.W    #$FFFE,D1            ;LORDS OF WAR
  499.         move.w    d1,(bm_BytesPerRow,a0)
  500.         move.w    d2,(bm_Rows,a0)
  501.         clr.b    (bm_Flags,a0)
  502.         move.b    d0,(bm_Depth,a0)
  503.         clr.w    (bm_Pad,a0)
  504.         move.l    #$bbbbbbbb,d1
  505. ;        clr.l    d1
  506.         move.l    d1,(bm_Planes,a0)
  507.         move.l    d1,(bm_Planes+4,a0)
  508.         move.l    d1,(bm_Planes+8,a0)
  509.         move.l    d1,(bm_Planes+12,a0)
  510.         move.l    d1,(bm_Planes+16,a0)
  511.         move.l    d1,(bm_Planes+20,a0)
  512.         move.l    d1,(bm_Planes+24,a0)
  513.         move.l    d1,(bm_Planes+28,a0)
  514.         rts
  515.  
  516. _MakeVPort    ;a0=view a1=viewport
  517.         move.l    a2,-(a7)
  518.         movem.l    a0-a1/a6,-(a7)
  519.         move.l    #200,d0
  520.         move.l    #MEMF_CHIP,d1
  521.         move.l    (4),a6
  522.         jsr    (_LVOAllocMem,a6)
  523.         movem.l    (a7)+,a0-a1/a6
  524.         tst.l    d0
  525.         trapeq
  526.         BEQ.W    .ERR
  527.         move.l    d0,a2                ;A2 = coplist
  528.         move.l    a2,(vp_DspIns,a1)
  529.         move.l    (vp_RasInfo,a1),a0
  530.         move.l    (ri_BitMap,a0),a0
  531.         move.w    #diwstrt,(a2)+
  532.         move.w    #$2981,d0
  533.         move.w    d0,(a2)+
  534.         move.w    #diwstop,(a2)+
  535.         move.w    (bm_BytesPerRow,a0),d1
  536.         lsl.w    #3,d1                ;bytes -> pixel
  537.         add.b    d1,d0
  538.         move.w    (bm_Rows,a0),d1
  539.         lsl.w    #8,d1
  540.         add.w    d1,d0
  541.         move.w    d0,(a2)+
  542.         move.l    #ddfstrt<<16+$0038,(a2)+
  543.         move.l    #ddfstop<<16+$00d0,(a2)+
  544.         move.l    #bplcon1<<16,(a2)+
  545.         move.l    #bpl1mod<<16,(a2)+
  546.         move.l    #bpl2mod<<16,(a2)+
  547.         move.w    #bplcon0,(a2)+
  548.         moveq    #0,d0
  549.         move.b    (bm_Depth,a0),d0
  550.         ror.w    #4,d0
  551.         or.w    #$200,d0
  552.         move.w    d0,(a2)+
  553.         move.b    (bm_Depth,a0),d0
  554.         lea    (bm_Planes,a0),a0
  555.         move.w    #bplpt,d1
  556. .lp        move.w    d1,(a2)+
  557.         addq.w    #2,d1
  558.         move.w    (a0)+,(a2)+
  559.         move.w    d1,(a2)+
  560.         addq.w    #2,d1
  561.         move.w    (a0)+,(a2)+
  562.         subq.b    #1,d0
  563.         bne    .lp
  564.         move.l    #dmacon<<16+DMAF_SETCLR+DMAF_RASTER,(a2)+
  565.         moveq    #-2,d0
  566.         move.l    d0,(a2)+
  567.         move.l    (a7)+,a2
  568.         rts
  569.  
  570. .ERR        pea    _LVOMakeVPort
  571.         pea    _gfxname
  572.         bra    _emufail
  573.  
  574. _CMove:
  575.     move.w    D0,copper_instruction
  576.     move.w    D1,copper_instruction+2
  577.     rts
  578.  
  579. _CWait:
  580.     move.b    D0,copper_instruction
  581.     move.b    D1,copper_instruction+1
  582.     move.w    #$FFFE,copper_instruction+2
  583.     rts
  584.  
  585. _CBump:
  586.     move.l    A0,-(A7)
  587.     move.l    copper_pointer,A0
  588.     move.l    copper_instruction(pc),(A0)+
  589.     move.l    A0,copper_pointer
  590.     move.l    #$FFFFFFFE,(A0)
  591.     move.l    (A7)+,A0
  592.     rts
  593.  
  594. copper_instruction:
  595.     dc.l    0
  596. copper_pointer:
  597.     dc.l    copper_buffer
  598. copper_buffer:
  599.     dc.l    $FFFFFFFE
  600.     blk.l    $1000,0
  601.  
  602. _MrgCop        ;a1=view
  603.         move.l    (v_ViewPort,a1),a0
  604.         cmp.l    #$FFFFFFFE,copper_buffer
  605.         bne    .nouser
  606.         move.l    #copper_buffer,(v_LOFCprList,a1)
  607.         rts
  608.  
  609. .nouser
  610.         move.l    (vp_DspIns,a0),(v_LOFCprList,a1)
  611.         rts
  612.  
  613. _MrgCop_old        ;a1=view
  614.         move.l    (v_ViewPort,a1),a0
  615.         move.l    (vp_DspIns,a0),(v_LOFCprList,a1)
  616.         rts
  617.  
  618. _LoadView    ;a1=view
  619.         move.l    a1,d0
  620.         beq    .noview
  621.         move.l    (v_LOFCprList,a1),d0
  622.         beq    .fail
  623.         move.l    d0,(gb_LOFlist,a6)
  624.         move.l    d0,(_custom+cop2lc)
  625.         rts
  626.  
  627. .noview        CLR.L    (gb_ActiView,a6)
  628.         MOVE.L    #STDCOPPER,(gb_LOFlist,a6)
  629.         move.l    (v_SHFCprList,a1),(gb_SHFlist,a6)
  630.         rts
  631.         
  632. .fail        GFXFAIL    _LVOLoadView
  633.  
  634. _LoadRGB4    ;a0=viewport a1=colors d0=count
  635.         bsr    _waitvb
  636.         lea    (_custom+color),a0
  637. .cpy        move.w    (a1)+,(a0)+
  638.         subq.w    #1,d0
  639.         bne    .cpy
  640.         rts
  641.  
  642. _SetRGB4    ;a0=viewport d0=pen d1=red d2=green d3=blue
  643.     ;    bsr    _waitvb
  644.         lea    (_custom+color),a0
  645.         ext.w    d0
  646.         add.w    d0,a0
  647.         add.w    d0,a0
  648.         lsl.w    #4,d1
  649.         or.w    d2,d1
  650.         lsl.w    #4,d1
  651.         or.w    d3,d1
  652.         move.w    d1,(a0)
  653.         rts
  654.  
  655. _VBeamPos    move.l    (_custom+vposr),d0
  656.         lsr.l    #8,d0
  657.         and.l    #$1ff,d0
  658.         rts
  659.  
  660. _WaitTOF    BSR.w    _waitvb
  661.         rts
  662.  
  663. _WaitBOVP:
  664.         bsr.w    _waitvb        ; -- added by JOTD
  665.         rts            ; -- I know this is not the accurate function
  666.  
  667. _ReadPixel    ;d0=x d1=y a1=rastport
  668.         move.l    (rp_BitMap,a1),a0
  669.         ext.l    d0
  670.         ror.l    #3,d0
  671.         cmp.w    (bm_BytesPerRow,a0),d0
  672.         bhs    .bad
  673.         cmp.w    (bm_Rows,a0),d1
  674.         bhs    .bad
  675.         mulu    (bm_BytesPerRow,a0),d1
  676.         add.w    d0,d1            ;byte offset
  677.         rol.l    #3,d0            ;bit offset
  678.         
  679.         movem.l    d2-d4,-(a7)
  680.         moveq    #0,d2
  681.         moveq    #0,d3
  682.         move.b    (bm_Depth,a0),d4
  683.         lea    (bm_Planes,a0),a0
  684.         
  685. .next        move.l    (a0)+,a1
  686.         btst    d0,(a1,d1.l)
  687.         beq    .1
  688.         bset    d2,d3
  689. .1        addq.l    #1,d2
  690.         cmp.b    d2,d4
  691.         bhi    .next
  692.         
  693.         move.l    d3,d0
  694.         movem.l    (a7)+,d2-d4
  695.         rts
  696.  
  697. .bad        moveq    #-1,d0
  698.         rts
  699.  
  700. _WritePixel    ;d0=x d1=y a1=rastport
  701.         move.l    (rp_BitMap,a1),a0
  702.         ext.l    d0
  703.         ror.l    #3,d0
  704.         cmp.w    (bm_BytesPerRow,a0),d0
  705.         bhs    .bad
  706.         cmp.w    (bm_Rows,a0),d1
  707.         bhs    .bad
  708.         mulu    (bm_BytesPerRow,a0),d1
  709.         add.w    d0,d1            ;byte offset
  710.         rol.l    #3,d0            ;bit offset
  711.         
  712.         movem.l    d2-d4,-(a7)
  713.         moveq    #0,d2
  714.         move.b    (rp_FgPen,a1),d3
  715.         move.b    (bm_Depth,a0),d4
  716.         lea    (bm_Planes,a0),a0
  717.         
  718. .next        move.l    (a0)+,a1
  719.         btst    d2,d3
  720.         beq    .clear
  721. .set        bset    d0,(a1,d1.w)
  722.         bra    .1
  723. .clear        bclr    d0,(a1,d1.w)
  724. .1        addq.l    #1,d2
  725.         cmp.b    d2,d4
  726.         bhi    .next
  727.         
  728.         move.l    d3,d0
  729.         movem.l    (a7)+,d2-d4
  730.         rts
  731.  
  732. .bad        moveq    #-1,d0
  733.         rts
  734.  
  735. ; added by JOTD. Untested
  736.  
  737. _SetRast:
  738.     movem.l    D2-D7/A2-A6,-(A7)
  739. ;;    move.l    rp_BitMap(A1),A0    ; pointer on bitmap
  740. ;;    move.w    (bm_BytesPerRow)
  741.     bsr    _SETAPEN
  742.     moveq.l    #0,D0    ; xmin
  743.     moveq.l    #0,D1    ; ymin
  744.     move.l    #320,D2    ; xmax
  745.     move.l    #200,D3 ; ymax
  746.     bsr    _RectFill
  747.     movem.l    (A7)+,D2-D7/A2-A6
  748.     rts
  749.  
  750. ; added by JOTD. Not optimized and not tested AT ALL
  751.  
  752.     ;d0=xmin d1=ymin d2=xmax d3=ymax a1=rastport
  753. _RectFill:
  754.     movem.l    a2/d2-d7,-(A7)
  755.  
  756.     move.l    d0,d7
  757. .loopx
  758. .loopy
  759.     move.l    d0,d5
  760.     move.l    d1,d6
  761.     move.l    a1,a2
  762.     bsr    _WritePixel
  763.     move.l    a2,a1
  764.     move.l    d5,d0
  765.     move.l    d6,d1
  766.     addq.l    #1,d0
  767.     cmp.l    d0,d2
  768.     bcc.b    .loopx    
  769.     move.l    d7,d0
  770.     addq.l    #1,d1
  771.     cmp.l    d1,d3
  772.     bcc.b    .loopy
  773.  
  774.     movem.l    (A7)+,a2/d2-d7
  775.     rts
  776.  
  777.  
  778. **************************************************************************
  779. *    SPRITES
  780. **************************************************************************
  781.  
  782. _FreeSprite    ;d0=pick
  783.         bclr    d0,(gb_SpriteReserved,a6)
  784.         rts
  785.  
  786. _GetSprite    ;a0=sprite d0=pick
  787.         tst.w    d0
  788.         bmi    .any
  789.         bset    d0,(gb_SpriteReserved,a6)
  790.         bne    .error
  791. .end        move.b    d0,(ss_num,a0)
  792.         ext.l    d0
  793.         rts
  794.  
  795. .error        moveq    #-1,d0
  796.         rts
  797.  
  798. .any        cmp.b    (gb_SpriteReserved,a6),d0
  799.         beq    .error
  800. .next        addq.w    #1,d0
  801.         bset    d0,(gb_SpriteReserved,a6)
  802.         bne    .next
  803.         bra    .end
  804.  
  805. _ChangeSprite    ;a0=viewport a1=simplesprite a2=data
  806.         moveq    #0,d0
  807.         move.b    (ss_num,a1),d0
  808.         lsl.w    #2,d0
  809.         lea    (_sprites),a0
  810.         move.l    a2,(a0,d0.w)
  811.         move.w    #DMAF_SETCLR!DMAF_SPRITE,(_custom+dmacon)
  812.         rts
  813.  
  814. _MoveSprite    ;a0=viewport a1=simplesprite d0=x d1=y
  815.         ;129,41 top,left
  816.         move.l    d2,-(a7)
  817.         moveq    #0,d2
  818.         move.b    (ss_num,a1),d2
  819.         lsl.w    #2,d2
  820.         lea    (_sprites),a0
  821.         move.l    (a0,d2.w),a0
  822.         add.w    #129,d0            ;d0 hor
  823.         add.w    #41,d1            ;d1 top
  824.         move.w    d1,d2
  825.         add.w    (ss_height,a1),d2    ;d2 bottom
  826.         move.b    d1,(a0)+        ;top7..top0
  827.         ror.w    #1,d0
  828.         move.b    d0,(a0)+        ;hor8..hor1
  829.         move.b    d2,(a0)+        ;bot7..bot0
  830.         lsr.w    #8,d1
  831.         lsl.w    #7,d2
  832.         addx.w    d2,d2
  833.         addx.w    d1,d1
  834.         addx.w    d0,d0
  835.         addx.w    d1,d1
  836.         move.b    d1,(a0)+
  837.         move.l    (a7)+,d2
  838.         rts
  839.  
  840. **************************************************************************
  841. *    BLITTER
  842. **************************************************************************
  843.  
  844. _WaitBlit
  845. .wait        tst.b    (_ciaa)
  846.         tst.b    (_ciaa)
  847.         btst    #DMAB_BLTDONE-8,(_custom+dmaconr)
  848.         bne.b    .wait
  849.         tst.b    (_ciaa)
  850.         rts
  851.  
  852. _BltBitMap    ;a0=sbitmap d0=sx d1=sy
  853.         ;a1=dbitmap d2=dx d3=dy
  854.         ;d4=width d5=height d6=minterm d7=mask a2=buffer
  855.  
  856.         movem.l    d2-d7/a2-a3,-(a7)
  857.         lea    (_custom),a3
  858.  
  859.         mulu    (bm_BytesPerRow,a0),d1
  860.         ext.l    d0
  861.         ror.l    #4,d0
  862.         add.w    d0,d1
  863.         add.w    d0,d1            ;d1 = byte offset src
  864.  
  865.         mulu    (bm_BytesPerRow,a1),d3
  866.         ext.l    d2
  867.         ror.l    #4,d2
  868.         add.w    d2,d3
  869.         add.w    d2,d3            ;d3 = byte offset dest
  870.  
  871.         lsl.w    #6,d5            ;height
  872.         
  873.         and.w    #$00f0,d6
  874.         or.w    #$070a,d6
  875.         bsr    _WaitBlit
  876.         move.w    d6,(bltcon0,a3)
  877.         
  878.         moveq    #-1,d6
  879.         move.w    d6,(bltadat,a3)
  880.         clr.w    d2
  881.         rol.l    #4,d2            ;d2 = amount of pixels to skip in the first word in dest
  882.         lsr.w    d2,d6            ;d6.w = afwm
  883.         swap    d6
  884.         addq.w    #1,d5            ;d5 = width++ (the first word)
  885.         sub.w    #16,d4
  886.         add.w    d2,d4            ;d4 = pixels left to copy
  887.         ext.l    d4
  888.         ror.l    #4,d4
  889.         add.w    d4,d5            ;d5.w = size
  890.         clr.w    d4
  891.         rol.l    #4,d4            ;d4 = pixels left to copy (0..15)
  892.         beq    .1
  893.         addq.w    #1,d5            ;d5 = width++ (the last word)
  894.         lsr.w    d4,d6            ;d6.w = ~(alwm)
  895.         not.w    d6
  896. .1        move.l    d6,(bltafwm,a3)
  897.         
  898.         clr.w    d0
  899.         rol.l    #4,d0            ;pixel offset src
  900.         sub.w    d0,d2
  901.     ;    spl    d4            ;d4 = 0 if first src word must be preloaded (dma-b)
  902.         bpl    .2
  903.     ;this works only if the destination is word aligned !!!!!!
  904.     ;(in deuteros it is...) normally a second blit is neccessary in this case
  905.         addq.w    #1,d5            ;bltsize++
  906.         subq.w    #2,d3            ;dst-2
  907.         move.w    #0,(bltafwm,a3)
  908.         add.w    #16,d2
  909. .2        ror.w    #4,d2
  910.         move.w    d2,(bltcon1,a3)
  911.         
  912.         move.w    d5,d0
  913.         and.w    #$003f,d0
  914.         add.w    d0,d0
  915.         move.w    (bm_BytesPerRow,a0),d2
  916.         sub.w    d0,d2
  917.         move.w    d2,(bltbmod,a3)
  918.         move.w    (bm_BytesPerRow,a1),d2
  919.         sub.w    d0,d2
  920.         move.w    d2,(bltcmod,a3)
  921.         move.w    d2,(bltdmod,a3)
  922.  
  923.         moveq    #0,d6
  924. .do        btst    d6,d7            ;mask ?
  925.         beq    .next
  926.  
  927.         lsl.w    #2,d6
  928.         move.l    (bm_Planes,a0,d6.w),a2
  929.         add.l    d1,a2
  930.         move.l    (bm_Planes,a1,d6.w),d0
  931.         add.l    d3,d0
  932.         bsr    _WaitBlit
  933.         movem.l    d0/a2,(bltcpt,a3)
  934.         move.l    d0,(bltdpt,a3)
  935.         move.w    d5,(bltsize,a3)
  936.         lsr.w    #2,d6
  937.  
  938. .next        addq.w    #1,d6
  939.         cmp.b    (bm_Depth,a0),d6
  940.         beq    .end
  941.         cmp.b    (bm_Depth,a1),d6
  942.         bne    .do
  943. .end
  944.         movem.l    (a7)+,d2-d7/a2-a3
  945.         rts
  946.  
  947. _BltTemplate    ;a0=src d0=bitoffset d1=modulo
  948.         ;a1=rp d2=x d3=y d4=width d5=height
  949.  
  950.         movem.l    d2-d7/a2-a3,-(a7)
  951.         lea    (_custom),a3
  952.  
  953.         ext.l    d0
  954.         ror.l    #4,d0
  955.         add.w    d0,a0
  956.         add.w    d0,a0            ;a0 = src ptr
  957.  
  958.         move.l    (rp_BitMap,a1),a2
  959.         mulu    (bm_BytesPerRow,a2),d3
  960.         ext.l    d2
  961.         ror.l    #4,d2
  962.         add.w    d2,d3
  963.         add.w    d2,d3            ;d3 = byte offset dest
  964.  
  965.         lsl.w    #6,d5            ;height
  966.         
  967.         bsr    _WaitBlit
  968.         move.w    #$07aa,(bltcon0,a3)
  969.         
  970.         moveq    #-1,d6
  971.         move.w    d6,(bltadat,a3)
  972.         clr.w    d2
  973.         rol.l    #4,d2            ;d2 = amount of pixels to skip in the first word in dest
  974.         lsr.w    d2,d6            ;d6.w = afwm
  975.         swap    d6
  976.         addq.w    #1,d5            ;d5 = width++ (the first word)
  977.         sub.w    #16,d4
  978.         add.w    d2,d4            ;d4 = pixels left to copy
  979.         ext.l    d4
  980.         ror.l    #4,d4
  981.         add.w    d4,d5            ;d5.w = size
  982.         clr.w    d4
  983.         rol.l    #4,d4            ;d4 = pixels left to copy (0..15)
  984.         beq    .1
  985.         addq.w    #1,d5            ;d5 = width++ (the last word)
  986.         lsr.w    d4,d6            ;d6.w = ~(alwm)
  987.         not.w    d6
  988. .1        move.l    d6,(bltafwm,a3)
  989.         
  990.         clr.w    d0
  991.         rol.l    #4,d0            ;pixel offset src
  992.         sub.w    d0,d2
  993.     ;    spl    d4            ;d4 = 0 if first src word must be preloaded (dma-b)
  994.         bpl    .2
  995.     ;this works only if the destination is word aligned !!!!!!
  996.     ;(in deuteros it is...) normally a second blit is neccessary in this case
  997.         addq.w    #1,d5            ;bltsize++
  998.         subq.w    #2,d3            ;dst-2
  999.         move.w    #0,(bltafwm,a3)
  1000.         add.w    #16,d2
  1001. .2        ror.w    #4,d2
  1002.         move.w    d2,(bltcon1,a3)
  1003.         
  1004.         move.w    d5,d0
  1005.         and.w    #$003f,d0
  1006.         add.w    d0,d0
  1007.         move.w    d1,d2
  1008.         sub.w    d0,d2
  1009.         move.w    d2,(bltbmod,a3)
  1010.         move.w    (bm_BytesPerRow,a2),d2
  1011.         sub.w    d0,d2
  1012.         move.w    d2,(bltcmod,a3)
  1013.         move.w    d2,(bltdmod,a3)
  1014.  
  1015.         moveq    #0,d6
  1016. .do        lsl.w    #2,d6
  1017.         move.l    (bm_Planes,a2,d6.w),d0
  1018.         add.l    d3,d0
  1019.         bsr    _WaitBlit
  1020.         movem.l    d0/a0,(bltcpt,a3)
  1021.         move.l    d0,(bltdpt,a3)
  1022.         move.w    d5,(bltsize,a3)
  1023.         lsr.w    #2,d6
  1024.  
  1025. .next        addq.w    #1,d6
  1026.         cmp.b    (bm_Depth,a2),d6
  1027.         bne    .do
  1028.  
  1029.         movem.l    (a7)+,d2-d7/a2-a3
  1030.         rts
  1031.  
  1032.